home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 44 / Amiga Format CD44 (1999-08-26)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-10].iso / -in_the_mag- / basics / amos / easylife110_p1.lha / Demos / Tabifier.AMOS / Tabifier.amosSourceCode < prev   
AMOS Source Code  |  1992-02-26  |  21KB  |  576 lines

  1. '****************************************************************************
  2. '**   AMOS MUI Tagbank Editor V1.0  - By Paul Hickman (ph@doc.ic.ac.uk)    **
  3. '**                                                                        **
  4. '** This is both a utility program, and an example of writting MUI code -  **
  5. '** read through the source code after you have run it.                    **
  6. '****************************************************************************
  7. Set Buffer 30
  8. 'Screen Open 0,640,256,2,Hires 
  9. 'Palette 0,$FFF
  10. Screen Close 0
  11.  
  12. 'Return Codes  
  13. Global __RET_ABOUT,__RET_CONFIG,__RET_OVER,__RET_START,__RET_ABORT
  14. __RET_ABOUT=1 : __RET_CONFIG=2 : __RET_OVER=3
  15. __RET_START=4 : __RET_ABORT=5
  16.  
  17.  
  18. '
  19. 'Variables Initialisation
  20. '
  21. Global OK$,TITLE$
  22. OK$="*   _Ok   "
  23. TITLE$="AMOS/MUI Tabifier"
  24. SAFETY=8
  25.  
  26.  
  27. '
  28. 'Create the menu 
  29. '
  30. _MUIB_MENU_ITEM["About","?",1] : MI_ABOUT=Param
  31. _MUIB_MENU_ITEM["Hide","H",1] : MI_HIDE=Param
  32. _MUIB_MENU_ITEM["Save Config","L",1] : MI_CONFIG=Param
  33. _MUIB_MENU_BAR : MI_SEP1=Param
  34. _MUIB_MENU_ITEM["Quit","Q",1] : MI_QUIT=Param
  35. _MUIB_MENU[ Extension_16_04CE(MI_ABOUT)+ Extension_16_04CE(MI_HIDE)+ Extension_16_04CE(MI_CONFIG)+ Extension_16_04CE(MI_SEP1)+ Extension_16_04CE(MI_QUIT),"Application"]
  36. MU_APP=Param
  37.  
  38.  Extension_16_0A72 True : MI_DETAB= Extension_16_0A98("Menuitem.mui", Extension_16_0BFE("MAKE_Menuitem_Check", Extension_16_094C("Detabify Only"),False))
  39.  Extension_16_0A72 True : MI_GUIDE= Extension_16_0A98("Menuitem.mui", Extension_16_0BFE("MAKE_Menuitem_Check", Extension_16_094C("Amigaguide Mode"),False))
  40. _MUIB_MENU[ Extension_16_04CE(MI_DETAB)+ Extension_16_04CE(MI_GUIDE),"Options"]
  41. MU_OPT=Param
  42.  
  43. _MUIB_MENUSTRIP[ Extension_16_04CE(MU_APP)+ Extension_16_04CE(MU_OPT)]
  44. MS_MAIN=Param
  45.  
  46.  
  47.  
  48.  
  49.  
  50. '
  51. 'Create the main window
  52. '
  53. _MUIB_FILESTRING["In File:","i","home:extensions/easylife/easylifemui.ag","Select File To Tabify"] : INFILE_OBJ=Param
  54. INFILE_STR_OBJ=MUI_OBJ2
  55.  
  56. _MUIB_FILESTRING["Out File:","o","home:extensions/easylife/easylifemui.ag","Select File To Tabify"] : OUTFILE_OBJ=Param
  57. OUTFILE_STR_OBJ=MUI_OBJ2
  58.  
  59. _MUIB_CYCLE["1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16"] : OLDTAB_CYC=Param
  60. _MUIB_LABELOBJ["Old Tab Size:","",OLDTAB_CYC,False] : OLDTAB_OBJ=Param
  61.  Extension_16_09C0 OLDTAB_CYC,"MUIA_Cycle_Active",7
  62.  
  63. _MUIB_CYCLE["1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16"] : NEWTAB_CYC=Param
  64. _MUIB_LABELOBJ["New Tab Size:","",NEWTAB_CYC,False] : NEWTAB_OBJ=Param
  65.  Extension_16_09C0 NEWTAB_CYC,"MUIA_Cycle_Active",7
  66.  
  67. _MUIB_GROUP[ Extension_16_04CE(OLDTAB_OBJ)+ Extension_16_04CE(NEWTAB_OBJ),1,0] : GRP1=Param
  68.  
  69. _MUIB_KEYBUTTON["Out = In","="] : BT_OVER=Param
  70. _MUIB_KEYBUTTON["Start","s"] : BT_START=Param
  71. _MUIB_KEYBUTTON["Abort","a"] : BT_ABORT=Param
  72. _MUIB_KEYBUTTON["Quit","q"] : BT_QUIT=Param
  73. BTN$= Extension_16_04CE(BT_OVER)+ Extension_16_04CE(BT_START)+ Extension_16_04CE(BT_ABORT)+ Extension_16_04CE(BT_QUIT)
  74. _MUIB_GROUP[BTN$,1,0] : GRP2=Param
  75.  Extension_16_0A72 False
  76. GAUGE_OBJ= Extension_16_0A98("Gauge.mui", Extension_16_0980("MUIA_Frame","MUIV_Frame_Gauge")+ Extension_16_0976("MUIA_Gauge_Horiz" To 1)+ Extension_16_098A("TAG_DONE"))
  77.  
  78. _MUIB_GROUP[ Extension_16_04CE(INFILE_OBJ)+ Extension_16_04CE(OUTFILE_OBJ)+ Extension_16_04CE(GRP1)+ Extension_16_04CE(GRP2)+ Extension_16_04CE(GAUGE_OBJ),0,0] : MAIN_GRP=Param
  79.  
  80.  Extension_16_0A72 True
  81. WIN$= Extension_16_063A("MUIA_Window_Title",TITLE$)
  82. WIN$=WIN$+ Extension_16_0932(MAIN_GRP,"MUIA_Window_RootObject")
  83. WIN$=WIN$+ Extension_16_0976("MUIA_Window_ID" To Extension_16_04DC("MAIN"))
  84. WIN$=WIN$+ Extension_16_0932(MS_MAIN,"MUIA_Window_Menustrip")
  85. MAIN_WIN= Extension_16_0A98("Window.mui",WIN$+ Extension_16_04CE(0))
  86.  
  87.  
  88. SET1$= Extension_16_04CE(INFILE_OBJ)+ Extension_16_04CE(OUTFILE_OBJ)+ Extension_16_04CE(OLDTAB_OBJ)+ Extension_16_04CE(NEWTAB_OBJ)+ Extension_16_04CE(BT_OVER)+ Extension_16_04CE(BT_START)+ Extension_16_04CE(BT_QUIT)+ Extension_16_04CE(0)
  89. SET2$= Extension_16_04CE(BT_ABORT)+ Extension_16_04CE(GAUGE_OBJ)+ Extension_16_04CE(0)
  90.  
  91.  Extension_16_0A18 MAIN_WIN, Extension_16_095A("MUIM_MultiSet","MUIA_Disabled" To 1)+SET2$
  92.  
  93.  
  94.  
  95.  
  96. '
  97. 'Create the applicaton 
  98. '
  99.  Extension_16_0A72 True
  100. APP$= Extension_16_063A("MUIA_Application_Author","Paul Hickman")
  101. APP$=APP$+ Extension_16_063A("MUIA_Application_Base","TABIFIER")
  102. APP$=APP$+ Extension_16_063A("MUIA_Application_Title",TITLE$)
  103. APP$=APP$+ Extension_16_063A("MUIA_Application_Version","$VER: Amos/MUI Tabifier 1.0 (09.09.94)")
  104. APP$=APP$+ Extension_16_063A("MUIA_Application_Copyright","Paul Hickman 1994")
  105. APP$=APP$+ Extension_16_063A("MUIA_Application_Description","Replaces Spaces with Tabs")
  106. '*************************************************** 
  107. 'Always set this attribute when using MUI from AMOS  
  108. '
  109. APP$=APP$+ Extension_16_0976("MUIA_Application_SingleTask" To 1)
  110. '*************************************************** 
  111. APP$=APP$+ Extension_16_0932(MAIN_WIN,"MUIA_Application_Window")
  112. APP$=APP$+ Extension_16_063A("MUIA_Application_HelpFile","HELP:Tabifier.Guide")
  113. APP$=APP$+ Extension_16_098A("TAG_DONE")
  114. APP_OBJ= Extension_16_0A82(APP$)
  115. If APP_OBJ=0
  116.    Print "Failed to create application."
  117.    End 
  118. End If 
  119.  Extension_16_0A62 False
  120.  
  121.  
  122.  
  123. '
  124. 'Set which objects save their configurations & Reload current settings.
  125. '
  126.  
  127.  Extension_16_09C0 MI_DETAB,"MUIA_ExportID", Extension_16_04DC("DTAB")
  128.  Extension_16_09C0 MI_GUIDE,"MUIA_ExportID", Extension_16_04DC("GIDE")
  129.  Extension_16_09C0 INFILE_STR_OBJ,"MUIA_ExportID", Extension_16_04DC("INFL")
  130.  Extension_16_09C0 OUTFILE_STR_OBJ,"MUIA_ExportID", Extension_16_04DC("OTFL")
  131.  Extension_16_09C0 OLDTAB_CYC,"MUIA_ExportID", Extension_16_04DC("OTAB")
  132.  Extension_16_09C0 NEWTAB_CYC,"MUIA_ExportID", Extension_16_04DC("NTAB")
  133.  
  134.  Extension_16_0A18 Extension_16_0AC4 , Extension_16_0980("MUIM_Application_Load","MUIV_Application_Load_ENV")
  135.  
  136.  
  137.  
  138. '
  139. 'Setup some notifications
  140. '
  141. 'Application Quits.  
  142. '
  143.  Extension_16_0A18 MAIN_WIN, Extension_16_0C14("NOT_WindowClose_Quit")
  144.  
  145. 'Tab Cycling 
  146. '
  147.  Extension_16_0A18 MAIN_WIN, Extension_16_098A("MUIM_Window_SetCycleChain")+ Extension_16_04CE(INFILE_STR_OBJ)+ Extension_16_04CE(OUTFILE_STR_OBJ)+ Extension_16_04CE(OLDTAB_CYC)+ Extension_16_04CE(NEWTAB_CYC)+BTN$+ Extension_16_098A("TAG_DONE")
  148.  
  149. 'Return values for Buttons in main window
  150. '
  151.  Extension_16_0A18 BT_OVER, Extension_16_0C0A("NOT_Pressed",__RET_OVER)
  152.  Extension_16_0A18 BT_START, Extension_16_0C0A("NOT_Pressed",__RET_START)
  153.  Extension_16_0A18 BT_ABORT, Extension_16_0C0A("NOT_Pressed",__RET_ABORT)
  154.  Extension_16_0A18 BT_QUIT, Extension_16_0C0A("NOT_Pressed", Extension_16_0992("MUIV_Application_ReturnID_Quit"))
  155.  
  156. 'Menu Notifications
  157. '
  158.  Extension_16_0A38 MI_QUIT,"MUIA_Menuitem_Trigger", Extension_16_0992("MUIV_EveryTime") To APP_OBJ, Extension_16_0C14("TAG_ReturnQuit")
  159.  Extension_16_0A38 MI_HIDE,"MUIA_Menuitem_Trigger", Extension_16_0992("MUIV_EveryTime") To APP_OBJ, Extension_16_095A("MUIM_Set","MUIA_Application_Iconified" To 1)
  160.  Extension_16_0A18 MI_ABOUT, Extension_16_0C0A("NOT_Menu",__RET_ABOUT)
  161.  Extension_16_0A18 MI_CONFIG, Extension_16_0C0A("NOT_Menu",__RET_CONFIG)
  162.  
  163. '
  164. 'Run the MUI interface 
  165. '  
  166. '
  167. '
  168. 'Open any windows you want initially opened
  169. '------------------------------------------
  170. '
  171.  Extension_16_09C0 MAIN_WIN,"MUIA_Window_Open",1
  172. If Extension_16_09FC(MAIN_WIN,"MUIA_Window_Open")=False
  173.    Print "Failed to open main window."
  174.    End 
  175. End If 
  176.  
  177. 'Run MUI interface 
  178. '----------------- 
  179. 'Amos Lock 
  180. Amos To Back 
  181. _MUI_MAIN_LOOP
  182. _MUI_APPLICATION_QUIT
  183.  
  184. '****************************************************************************
  185. '
  186. 'General Purpose MUI Support Procedures (User Callable)
  187. '======================================
  188. '
  189. Procedure _MUI_MAIN_LOOP
  190.    'Call this when you want to wait for some user input 
  191.    '
  192.    Do 
  193.       Multi Wait 
  194.       RES= Extension_16_0AD2 
  195.       If RES=-1
  196.          _MUI_APPLICATION_QUIT
  197.       End If 
  198.       If RES<-1
  199.          _MUI_RETURN_ID[RES]
  200.       Else 
  201.          _USER_RETURN_ID[RES]
  202.       End If 
  203.       'If RES<>0 : Amos To Front : Cls : Print RES,Param : Wait Key : Amos To Back : End If  
  204.  
  205.       Exit If Param
  206.    Loop 
  207. End Proc
  208. '
  209. 'MUI Object Creation Procedures  
  210. '==============================
  211. '
  212. Procedure _MUIB_KEYBUTTON[LABEL$,HOTKEY$]
  213.    '
  214.    'Create a button with a hotkey. Returns button object. 
  215.    '  
  216.     Extension_16_0A72 False
  217. End Proc[ Extension_16_0A98("Text.mui", Extension_16_0BFE("MAKE_KeyButton", Extension_16_094C(LABEL$),Asc(HOTKEY$)))]
  218. Procedure _MUIB_KEYSTRING[S$,MXLEN,HOTKEY$,LIST]
  219.    '
  220.    'Creates & Returns a string gadget, with a hotkey to activate it.
  221.    '
  222.     Extension_16_0A72 True
  223.    S$=Left$(S$,MXLEN)+String$(Chr$(0),Max(0,MXLEN-Len(S$)))+Chr$(0)
  224.    A$= Extension_16_0980("MUIA_Frame","MUIV_Frame_String")
  225.    A$=A$+ Extension_16_063A("MUIA_String_Contents",S$)
  226.    A$=A$+ Extension_16_0976("MUIA_String_MaxLen" To MXLEN+1)
  227.    A$=A$+ Extension_16_0976("MUIA_ControlChar" To Asc(HOTKEY$))
  228.    If LIST<>0
  229.       A$=A$+ Extension_16_0976("MUIA_String_AttachedList" To LIST)
  230.    End If 
  231. End Proc[ Extension_16_0A98("String.mui",A$+ Extension_16_04CE(0))]
  232. Procedure _MUIB_LABSTRING[S$,MXLEN,HOTKEY$,LABEL$,LIST]
  233.    'Creates & Returns a labeled string gadget with a hotkey to activate it. 
  234.    'A group object is returned + Shared variables MUI_OBJ1=Label, 
  235.    'MUI_OBJ2=String 
  236.    '
  237.    _MUIB_KEYSTRING[S$,MXLEN,HOTKEY$,LIST]
  238.    _MUIB_LABELOBJ[LABEL$,HOTKEY$,Param,False]
  239. End Proc[Param]
  240. Procedure _MUIB_FILESTRING[LABEL$,HOTKEY$,S$,_ASL_TITLE$]
  241.    '
  242.    'Creates a labeled string gadget of 256 characters with a asl
  243.    'filerequester popup to fill in the string. _ASl_TITLE$ is the file  
  244.    'requester window title. 
  245.    '
  246.    'Returns a PopAsl object + Shared variables: MUI_OBJ1=Label Object 
  247.    'MUI_OBJ2=String Object, MUI_OBJ3=Popup Button Object
  248.    '
  249.    Shared MUI_OBJ3
  250.    _MUIB_LABSTRING[S$,256,HOTKEY$,LABEL$,0] : SOBJ=Param
  251.    MUI_OBJ3= Extension_16_0B68( Extension_16_0992("MUII_PopFile"))
  252.     Extension_16_0A72 True
  253.    FSOBJ= Extension_16_0A98("Popasl.mui", Extension_16_0932(SOBJ,"MUIA_Popstring_String")+ Extension_16_0932(MUI_OBJ3,"MUIA_Popstring_Button")+ Extension_16_063A("ASLFR_TITLETEXT",_ASL_TITLE$)+ Extension_16_04CE(0))
  254. End Proc[FSOBJ]
  255. Procedure _MUIB_CYCLE[LIST$]
  256.    '
  257.    'Takes a string of cycle gadget entires seperated by '|' characters, and 
  258.    'returns a Cycle object. 
  259.    '
  260.    OSEP=0 : PTR$=""
  261.     Extension_16_0A72 True
  262.    Repeat 
  263.       SEP= Extension_16_009E(LIST$,124,OSEP) : If SEP=0 : SEP=Len(LIST$)+1 : End If 
  264.       _FORMAT[Mid$(LIST$,OSEP+1,SEP-OSEP-1)]
  265.       PTR$=PTR$+ Extension_16_0644(Param$)
  266.       OSEP=SEP
  267.    Until SEP>Len(LIST$)
  268. End Proc[ Extension_16_0A98("Cycle.mui", Extension_16_063A("MUIA_Cycle_Entries",PTR$+ Extension_16_04CE(0))+ Extension_16_04CE(0))
  269. Procedure _MUIB_LABELOBJ[LABEL$,HOTKEY$,OBJ,RIGHT]
  270.    '
  271.    'Attaches a label to the object. HOTKEY$ is the hotkey ALREADY assigned
  272.    'to the object, which should be underlined in the label. If RIGHT is non-
  273.    'zero, the label is put on the right of the object, not the left.
  274.    '
  275.    'Returns a group object, and shared varaibles MUI_OBJ1=Label Object
  276.    '                                             MUI_OBJ2=OBJ 
  277.    '
  278.    Shared MUI_OBJ1,MUI_OBJ2
  279.    _FORMAT[LABEL$]
  280.     Extension_16_0A72 False
  281.    MUI_OBJ1= Extension_16_0A98("Text.mui", Extension_16_063A("MUIA_Text_Contents",Param$)+ Extension_16_0976("MUIA_Text_HiChar" To Asc(HOTKEY$))+ Extension_16_0976("MUIA_Text_SetMax" To RIGHT+1)+ Extension_16_04CE(0))
  282.    MUI_OBJ2=OBJ
  283.    If RIGHT
  284.       _MUIB_GROUP[ Extension_16_04CE(MUI_OBJ2)+ Extension_16_04CE(MUI_OBJ1),1,0]
  285.    Else 
  286.       _MUIB_GROUP[ Extension_16_04CE(MUI_OBJ1)+ Extension_16_04CE(MUI_OBJ2),1,0]
  287.    End If 
  288. End Proc[Param]
  289. Procedure _MUIB_GROUP[OBJ$,HORIZ,FRAME]
  290.    '
  291.    'Takes a list of longwords which are object pointers, and makes a
  292.    'group out of them. If HORIZ is true, a horizontal group is created. 
  293.    'If FRAME is True, a group frame is added. 
  294.    '
  295.    COMPOSITE[OBJ$,"MUIA_Group_Child"] : _TAG$=Param$
  296.    If HORIZ=1 Then _TAG$=_TAG$+ Extension_16_0976("MUIA_Group_Horiz" To 1)
  297.    If FRAME=1 Then _TAG$=_TAG$+ Extension_16_0980("MUIA_Frame","MUIV_Frame_Group")
  298. End Proc[ Extension_16_0A98("Group.mui",_TAG$+ Extension_16_04CE(0))]
  299. Procedure _MUIB_MENU_ITEM[TXT$,HOTKEY$,ENABLED]
  300.     Extension_16_0A72 True
  301.    A$= Extension_16_063A("MUIA_Menuitem_Title",TXT$)
  302.    A$=A$+ Extension_16_063A("MUIA_Menuitem_Shortcut",HOTKEY$)
  303.    A$=A$+ Extension_16_0976("MUIA_Menuitem_Enabled" To ENABLED)
  304. End Proc[ Extension_16_0A98('Menuitem.mui',A$)]
  305. Procedure _MUIB_MENU_BAR
  306.     Extension_16_0A72 True
  307.    A$= Extension_16_0976("MUIA_Menuitem_Title" To -1)
  308.    A$=A$+ Extension_16_0976("MUIA_Menuitem_Enabled" To 0)
  309. End Proc[ Extension_16_0A98('Menuitem.mui',A$)]
  310. Procedure _MUIB_MENU[ITEM$,TXT$]
  311.    '
  312.    'Takes a list of menuitems & Creates a menu. 
  313.    '
  314.    COMPOSITE[ITEM$,"MUIA_Family_Child"]
  315.     Extension_16_0A62 True
  316.    _TAG$=Param$+ Extension_16_063A("MUIA_Menu_Title",TXT$)
  317. End Proc[ Extension_16_0A98('Menu.mui',_TAG$)]
  318. Procedure _MUIB_MENUSTRIP[MEN$]
  319.    '
  320.    'Takes a list of menus & create a menu strip to be attached
  321.    'to a window/application object. 
  322.    '
  323.    COMPOSITE[MEN$,"MUIA_Family_Child"]
  324. End Proc[ Extension_16_0A98('Menustrip.mui',Param$+ Extension_16_0976("MUIA_Menustrip_Enabled" To 1)+ Extension_16_098A("TAG_DONE"))]
  325. '
  326. 'Private Sub-Procedures of MUI Procedures - Do not call directly 
  327. '=============================================================== 
  328. '
  329. Procedure COMPOSITE[OBJ$,T$]
  330.    'Used to construct objects with lists of child objects 
  331.    '
  332.     Extension_16_0A72 False
  333.    _TAG$=""
  334.    For A=1 To Len(OBJ$)-3 Step 4
  335.       _TAG$=_TAG$+ Extension_16_0932( Extension_16_04DC(Mid$(OBJ$,A,4)),T$)
  336.    Next A
  337. End Proc[_TAG$]
  338. Procedure _FORMAT[EL$]
  339.    'Used to convert /n,/a etc. in strings 
  340.    '
  341.    X= Extension_16_008C(EL$,92)
  342.    While X
  343.       Y=Asc(Mid$(EL$,X+1))
  344.       If Y=97
  345.          R$="'"
  346.       Else If Y=98
  347.          R$="`"
  348.       Else If Y=92
  349.          R$="\"
  350.       Else If Y=113
  351.          R$='"'
  352.       Else If Y=101
  353.          R$=Chr$(27)
  354.       Else If Y=116
  355.          R$=Chr$(9)
  356.       Else If Y=110
  357.          R$=Chr$(10)
  358.       End If 
  359.       EL$=Left$(EL$,X-1)+R$+Mid$(EL$,X+2)
  360.       X= Extension_16_009E(EL$,92,X)
  361.    Wend 
  362.    EL$=EL$+Chr$(0)
  363.    If Len(EL$) mod 2
  364.       EL$=EL$+Chr$(0)
  365.    End If 
  366. End Proc[EL$]
  367. Procedure _MUI_RETURN_ID[ID]
  368.    'Internal version of USER_RETURN_ID for -ve return ID's. 
  369. End Proc[False]
  370.  
  371.  
  372. '
  373. 'Procedures you MUST modify to suit your application 
  374. '=================================================== 
  375. '
  376. Procedure _USER_RETURN_ID[ID]
  377.    Shared MAIN_WIN,INFILE_OBJ,OUTFILE_OBJ,SET1$,SET2$,MU_APP
  378.    If ID=__RET_ABOUT
  379.       AB$="AMOS/MUI Tabifier V1.0\n\nWritten By Paul Hickman\nE-Mail: ph@doc.ic.ac.uk\n\n"
  380.       AB$=AB$+"See documentation for full\ndistribution conditions and\ninstructions.\n\n"
  381.       AB$=AB$+"Chip Mem:"+Str$(Chip Free)+"\nFast Mem:"+Str$(Fast Free)+"\nVariable Buffer:"+Str$(Free)
  382.       _FORMAT[AB$]
  383.       NULL= Extension_16_0B10(0,TITLE$,OK$,Chr$(27)+"c"+Param$)
  384.  
  385.  
  386.    Else If ID=__RET_CONFIG
  387.       Trap Open In 1,"ENV:mui/TABIFIER.wini"
  388.       If Errtrap=False
  389.          L=Lof(1) : Close 1
  390.          Reserve As Work 20,L
  391.          Bload "ENV:mui/TABIFIER.wini",Start(20)
  392.          E= Extension_16_07DA("ENVARC:mui")
  393.          If E<0
  394.             NULL= Extension_16_0B10(0,TITLE$,OK$,"There is a file called mui in ENVARC:\nGet rid of it!")
  395.             Pop Proc
  396.          Else If E=0
  397.             Mkdir "ENVARC:mui"
  398.          End If 
  399.          Bsave "ENVARC:mui/TAGTABIFIER.wini",Start(20) To Start(20)+Length(20)
  400.          Erase 20
  401.       End If 
  402.        Extension_16_0A18 Extension_16_0AC4 , Extension_16_0980("MUIM_Application_Save","MUIV_Application_Save_ENVARC")
  403.        Extension_16_0A18 Extension_16_0AC4 , Extension_16_0980("MUIM_Application_Save","MUIV_Application_Save_ENV")
  404.  
  405.    Else If ID=__RET_OVER
  406.        Extension_16_099C OUTFILE_OBJ,"MUIA_String_Contents", Extension_16_09E0(INFILE_OBJ,"MUIA_String_Contents")
  407.  
  408.  
  409.    Else If ID=__RET_START
  410.        Extension_16_0A18 Extension_16_0AC4 , Extension_16_095A("MUIM_MultiSet","MUIA_Disabled" To 1)+SET1$
  411.        Extension_16_0A18 Extension_16_0AC4 , Extension_16_095A("MUIM_MultiSet","MUIA_Disabled" To 0)+SET2$
  412.        Extension_16_09C0 MU_APP,"MUIA_Menu_Enabled",0
  413.       TABIFY
  414.       Erase 10 : Erase 11
  415.        Extension_16_09C0 MU_APP,"MUIA_Menu_Enabled",1
  416.        Extension_16_0A18 Extension_16_0AC4 , Extension_16_095A("MUIM_MultiSet","MUIA_Disabled" To 0)+SET1$
  417.        Extension_16_0A18 Extension_16_0AC4 , Extension_16_095A("MUIM_MultiSet","MUIA_Disabled" To 1)+SET2$
  418.    End If 
  419. End Proc[False]
  420.  
  421. Procedure _IS_ASL_OPEN
  422.  
  423.    'Called when trying to quit, this must return True if any ASL requesters 
  424.    'are open. Basically add '_ASL_OPEN=Mui Get(...) or _ASL_OPEN' lines for 
  425.    'each asl object.
  426.  
  427.    Shared INFILE_OBJ,OUTFILE_OBJ
  428.  
  429.    _ASL_OPEN= Extension_16_09FC(INFILE_OBJ,"MUIA_Popasl_Active")
  430.    _ASL_OPEN= Extension_16_09FC(OUTFILE_OBJ,"MUIA_Popasl_Active") or _ASL_OPEN
  431.  
  432. End Proc[_ASL_OPEN]
  433. Procedure _MUI_APPLICATION_QUIT
  434.    'This procedure is called when the user (Or something else) wants to 
  435.    ' terminate the program
  436.    '
  437.    'The default code is as follows
  438.    '
  439.    _IS_ASL_OPEN
  440.    If Param=False
  441.       Shared APP_OBJ
  442.        Extension_16_0AB2 APP_OBJ
  443.       Amos To Front 
  444.       Amos Unlock 
  445.       End 
  446.    End If 
  447. End Proc
  448.  
  449. '
  450. 'Procedures specific to this program 
  451. '=================================== 
  452. '
  453. Procedure TABIFY
  454.    Shared INFILE_OBJ,OUTFILE_OBJ,OLDTAB_OBJ,NEWTAB_OBJ,GAUGE_OBJ
  455.    Shared MI_DETAB,MI_GUIDE,SAFETY
  456.  
  457.    IN_TAB= Extension_16_09FC(OLDTAB_OBJ,"MUIA_Cycle_Active")+1
  458.    IN_FILE$= Extension_16_09E0(INFILE_OBJ,"MUIA_String_Contents")
  459.  
  460.    OUT_TAB= Extension_16_09FC(NEWTAB_OBJ,"MUIA_Cycle_Active")+1
  461.    OUT_FILE$= Extension_16_09E0(OUTFILE_OBJ,"MUIA_String_Contents")
  462.  
  463.    DETAB= Extension_16_09FC(MI_DETAB,"MUIA_Menuitem_Checked")
  464.    GUIDE= Extension_16_09FC(MI_GUIDE,"MUIA_Menuitem_Checked")
  465.  
  466.  
  467.    If IN_FILE$="" Then Pop Proc
  468.    If OUT_FILE$="" Then Pop Proc
  469.  
  470.    If Extension_16_07DA(IN_FILE$)>=0
  471.       NULL= Extension_16_0B10(0,TITLE$,OK$,"Error: File Not Found")
  472.       Pop Proc
  473.    End If 
  474.  
  475.    On Error Goto GO_ERR
  476.  
  477.    Open In 1,IN_FILE$
  478.    L=Lof(1)
  479.    Reserve As Work 10,L
  480.    Sload 1 To Start(10),L
  481.    Close 1
  482.  
  483.     Extension_16_09C0 GAUGE_OBJ,"MUIA_Gauge_Max",L
  484.  
  485.    S=Start(10) : E=Start(10)+Length(10)
  486.    If OUT_TAB>=IN_TAB
  487.       Reserve As Work 11,L+SAFETY*1024
  488.       W=Start(11) : WB=11
  489.    End If 
  490.    INP=0
  491.    While S<E
  492.       LINE$= Extension_16_0292(S,65000,10) : Add S,Len(LINE$)+1
  493.  
  494.        Extension_16_09C0 GAUGE_OBJ,"MUIA_Gauge_Current",S-Start(10)
  495.       Inc INP
  496.       If INP mod 20
  497.          FRED=0
  498.          RES= Extension_16_0A28( Extension_16_0AC4 , Extension_16_0976("MUIM_Application_Input" To Varptr(FRED)))
  499.          If RES=-1 : _MUI_APPLICATION_QUIT : End If 
  500.          If RES=__RET_ABORT : Pop Proc : End If 
  501.       End If 
  502.  
  503.       'First Remove All Existing Tabs  
  504.       '
  505.       T= Extension_16_008C(LINE$,9)
  506.       While T>0
  507.          LINE$=Left$(LINE$,T-1)+Space$(IN_TAB-((T-1) mod IN_TAB))+Mid$(LINE$,T+1)
  508.          T= Extension_16_008C(LINE$,9)
  509.       Wend 
  510.  
  511.       'Remove all trailing Spaces
  512.       '
  513.       LINE$=Left$(LINE$, Extension_16_0152(LINE$,32))
  514.  
  515.  
  516.       If DETAB
  517.          NEW_LINE$=LINE$
  518.       Else 
  519.       'Now Re-Tabify 
  520.       '
  521.       Y=0 : NEW_LINE$="" : OX=1
  522.       Do 
  523.          Y= Extension_16_009E(LINE$,32,Y)
  524.          Exit If Y=0
  525.          X= Extension_16_00DE(LINE$,32,Y)-1
  526.          Exit If X=-1
  527.          T=X/OUT_TAB-(Y-1)/OUT_TAB
  528.          If T>0
  529.             TS=X mod OUT_TAB
  530.          Else 
  531.             TS=X-Y+1
  532.          End If 
  533.          If(T=1) and(TS=0) and(X-Y=0)
  534.             TS=1 : T=0
  535.          End If 
  536.          If GUIDE
  537.             QUOTE_CHECK[LINE$,Y]
  538.             Exit If Param
  539.          End If 
  540.          NEW_LINE$=NEW_LINE$+Mid$(LINE$,OX,Y-OX)+String$(Chr$(9),T)+Space$(TS)
  541.          Y=X+1 : OX=X+1
  542.       Loop 
  543.       NEW_LINE$=NEW_LINE$+Mid$(LINE$,OX)+Chr$(10)
  544.       End If 
  545.  
  546.       'NOW Save THE LINE 
  547.       '
  548.       If W+Len(NEW_LINE$)>Start(WB)+Length(WB)
  549.          NULL= Extension_16_0B10(0,TITLE$,OK$,"Error: This makes file more than"+Str$(SAFETY)+"K longer")
  550.          Pop Proc
  551.       End If 
  552.       W= Extension_16_02AC(W,NEW_LINE$)
  553.    Wend 
  554.  
  555.    Bsave OUT_FILE$,Start(WB) To W
  556. Pop Proc
  557.  
  558.    GO_ERR:
  559.       Amos To Back 
  560.       NULL= Extension_16_0B10(0,TITLE$,OK$,"Error: "+Err$(Errn))
  561.       Resume GO_RES
  562.    GO_RES:
  563. End Proc
  564. Procedure QUOTE_CHECK[A$,P]
  565.    'Returns true if a quotes are open (I.E. Unpaired) at position P 
  566.    'of A$. Checks both types of quote, but ignores each type, if it 
  567.    'occurs within the other e.g. "Fred's" would return false - the
  568.    'one single quote is ignored as it is in double quotes. Single 
  569.    'quotes at the start of lines to form comments are NOT ignored.  
  570.    '  
  571.    Q1=False : Q2=False
  572.    For A=1 To P
  573.       If Mid$(A$,A,1)=Chr$(34) and Q2=False Then Q1= Not Q1
  574.       If Mid$(A$,A,1)=Chr$(39) and Q1=False Then Q2= Not Q2
  575.    Next A
  576. End Proc[Q1 or Q2]